/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */
package br.com.tmd.controlefinanceiro.bean;

import br.com.tmd.controlefinanceiro.modelo.Cliente;
import br.com.tmd.controlefinanceiro.modelo.Usuario;
import br.com.tmd.controlefinanceiro.persistence.ClienteDao;
import br.com.tmd.controlefinanceiro.persistence.UsuarioDao;
import java.util.Calendar;
import java.util.List;
import java.util.Set;
import javax.faces.application.FacesMessage;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ManagedProperty;
import javax.faces.bean.SessionScoped;
import javax.faces.context.FacesContext;
import org.jcommon.encryption.SimpleMD5;

/**
 *
 * @author luis
 */
@ManagedBean(name = "clienteBean")
@SessionScoped
public class ClienteBean {

    private List<Cliente> lista;
    private String confirmarSenha;
    private String permissao;
    private String senhaAtual;

    private Cliente cliente = new Cliente();
    @ManagedProperty(value = "#{usuarioBean}")
    private UsuarioBean usuarioBean;

    public ClienteBean() {

    }

    public Cliente getCliente() {
        return cliente;
    }

    public void setCliente(Cliente cliente) {
        this.cliente = cliente;
    }

    public UsuarioBean getUsuarioBean() {
        return usuarioBean;
    }

    public void setUsuarioBean(UsuarioBean usuarioBean) {
        this.usuarioBean = usuarioBean;
    }

    public List<Cliente> getLista() throws Exception {
        ClienteDao dao = new ClienteDao();
        lista = dao.listaClientes();

        return this.lista;
    }

    public void setLista(List<Cliente> lista) {
        this.lista = lista;
    }

    public String getConfirmarSenha() {
        return confirmarSenha;
    }

    public void setConfirmarSenha(String confirmarSenha) {
        this.confirmarSenha = confirmarSenha;
    }

    public String getPermissao() {
        return permissao;
    }

    public void setPermissao(String permissao) {
        this.permissao = permissao;
    }

    public String getSenhaAtual() {
        return senhaAtual;
    }

    public void setSenhaAtual(String senhaAtual) {
        this.senhaAtual = senhaAtual;
    }

    //Metodos
    public String novo() {

        this.cliente = new Cliente();
        // this.usuario.setAtivo(true);
        this.confirmarSenha = null;
        return "cliente?faces-redirect=true";
    }

    public String salvar() {
        FacesContext context = FacesContext.getCurrentInstance();

        String senha = usuarioBean.getUsuario().getSenha();
        if (!senha.equals(this.confirmarSenha)) {
            FacesMessage facesMessage = new FacesMessage("Senhas não conferem.");
            context.addMessage(null, facesMessage);
            return null;
        }
        
        UsuarioDao testeLogin = new UsuarioDao();
        String login = usuarioBean.getUsuario().getLogin();
        String tipo = "C";
        Usuario usr = testeLogin.buscarPorLogin(login);
        if (usr.getLogin().equalsIgnoreCase(login) && usr.getTipo().equalsIgnoreCase(tipo)) {
            FacesMessage facesMessage = new FacesMessage("Login já existe!");
            context.addMessage(null, facesMessage);
            return null;
        }
        
        /*
         * Apartir daqui salva ou altera o usuário no banco de dados.
         */
        ClienteDao dao = new ClienteDao();
        Integer codigo = cliente.getCodigo();

        if (codigo == null || codigo == 0) {
            usuarioBean.getUsuario().getPermissao().add("ROLE_USUARIO");
            usuarioBean.getUsuario().setDataCadastro(Calendar.getInstance());
            usuarioBean.getUsuario().setAtivo(true);
            usuarioBean.getUsuario().setTipo("C");
            SimpleMD5 md5 = new SimpleMD5(usuarioBean.getUsuario().getSenha(), "");
            usuarioBean.getUsuario().setSenha(md5.toHexString());
            cliente.setUsuario(usuarioBean.getUsuario());
            dao.salvar(this.cliente);
        } else {
            if (!senhaAtual.equalsIgnoreCase(senha)) {
                this.confirmarSenha = usuarioBean.getUsuario().getSenha();
                SimpleMD5 md5 = new SimpleMD5(usuarioBean.getUsuario().getSenha(), "");
                usuarioBean.getUsuario().setSenha(md5.toHexString());
                cliente.setUsuario(usuarioBean.getUsuario());
                dao.alterar(this.cliente);
            } else {
                cliente.setUsuario(usuarioBean.getUsuario());
                dao.alterar(this.cliente);
            }
        }

        usuarioBean.setUsuario(new Usuario());
        this.cliente = new Cliente();
        this.confirmarSenha = null;
        return "cliente?faces-redirect=true";

    }

    public void excluir() {
        ClienteDao dao = new ClienteDao();
        dao.excluir(cliente);
    }

    public String editar() {
        usuarioBean.setUsuario(cliente.getUsuario());
        this.confirmarSenha = cliente.getUsuario().getSenha();
        this.senhaAtual = cliente.getUsuario().getSenha();
        //Foi setado o valor no codigo cliente para aparecer o valor do banco no selectOneMenu

        return "cliente?faces-redirect=true";
    }

    public String atribuiPermissao(Usuario usuario, String permissao) {
        usuarioBean.setUsuario(usuario);
        UsuarioDao dao = new UsuarioDao();
        Set<String> permissoes = usuarioBean.getUsuario().getPermissao();
        if (permissoes.contains(permissao)) {
            permissoes.remove(permissao);
            dao.alterar(usuario);
        } else {
            permissoes.add(permissao);
            dao.alterar(usuario);
        }
        return null;
    }

    public String ativar() {
        if (usuarioBean.getUsuario().isAtivo()) {
            usuarioBean.getUsuario().setAtivo(false);
        } else {
            usuarioBean.getUsuario().setAtivo(true);
        }
        UsuarioDao dao = new UsuarioDao();
        dao.alterar(usuarioBean.getUsuario());
        return null;
    }

    //Redireciona para página princiapal
    public String formPrincipal() {
        return "principal?faces-redirect=true";
    }

    //Redireciona para página consultaCliente
    public String consultarCliente() {
        return "consultaClientes?faces-redirect=true";
    }
}
